Step 5: BookmarkDAO Tests
Let’s test the Bookmark DAO. Create a subfolder data
in the tests
folder. Next, create a file BookmarkDAO.test.js
in the data
subfolder with the following content:
import { describe, beforeEach, expect, it } from "vitest";
import BookmarkDAO from "../../src/data/BookmarkDAO";
describe("Test BookmarkDAO", () => {
let bookmarkDao;
beforeEach(() => {
bookmarkDao = new BookmarkDAO();
});
it("test constructor()", () => {
expect(bookmarkDao.bookmarks.length).toBe(0);
});
});
Notice you can use the function describe(name, fn)
in each test file to create a suite that groups together several related tests.
The function it
is an alias to test
, and it defines a set of related expectations. It receives the test name and a function that holds the expectations to test. The describe-it
convention originated with the Ruby testing library RSpec.
The beforeEach
is an example of setup and teardown methods. In Vitest, there are several different setup and teardown methods, namely:
beforeAll
— called once before all tests.beforeEach
— called before each of these tests (before every test function).afterEach
— called after each of these tests (after every test function).afterAll
— called once after all tests.
Let’s add a beforeAll
operation to create several fake bookmarks. Moreover, we will add placeholders for more tests.
import { beforeAll, beforeEach, describe, expect, it } from "vitest";
import BookmarkDAO from "../../src/data/BookmarkDAO";
import { faker } from "@faker-js/faker";
import Bookmark from "../../src/model/Bookmark";
describe("Test BookmarkDAO", () => {
const numBookmarks = 5;
let bookmarks;
let bookmarkDao;
beforeAll(() => {
bookmarks = [];
for (let index = 0; index < numBookmarks; index++) {
bookmarks.push(
new Bookmark(faker.lorem.sentence(), faker.internet.url())
);
}
});
beforeEach(() => {
bookmarkDao = new BookmarkDAO();
});
it("test constructor()", () => {
expect(bookmarkDao.bookmarks.length).toBe(0);
});
it("test create()", () => {
});
it("test readAll()", () => {
});
it("test read() given valid ID", () => {
});
it("test read() given invalid ID", () => {
});
it("test update() given valid ID", () => {
});
it("test update() given invalid ID", () => {
});
it("test delete() given valid ID", () => {
});
it("test delete() given invalid ID", () => {
});
});
Please take a moment and implement the tests:
import { beforeAll, beforeEach, describe, expect, it } from "vitest";
import BookmarkDAO from "../../src/data/BookmarkDAO";
import { faker } from "@faker-js/faker";
import Bookmark from "../../src/model/Bookmark";
describe("Test BookmarkDAO", () => {
const numBookmarks = 5;
let bookmarks;
let bookmarkDao;
beforeAll(() => {
bookmarks = [];
for (let index = 0; index < numBookmarks; index++) {
bookmarks.push(
new Bookmark(faker.lorem.sentence(), faker.internet.url())
);
}
});
beforeEach(() => {
bookmarkDao = new BookmarkDAO();
});
it("test constructor()", () => {
expect(bookmarkDao.bookmarks.length).toBe(0);
});
it("test create()", () => {
const title = faker.lorem.sentence();
const url = faker.internet.url();
const bookmark = bookmarkDao.create({ title, url });
expect(bookmarkDao.bookmarks.length).toBe(1);
expect(bookmark.title).toBe(title);
expect(bookmark.url).toBe(url);
expect(bookmark.id).toBeDefined();
expect(bookmarkDao.bookmarks[0]).toMatchObject(bookmark);
});
it("test readAll()", () => {
bookmarkDao.bookmarks = bookmarks;
expect(bookmarkDao.readAll().length).toBe(bookmarks.length);
});
it("test read() given valid ID", () => {
bookmarkDao.bookmarks = bookmarks;
const bookmark = bookmarks[0];
expect(bookmarkDao.read(bookmark.id)).toMatchObject(bookmark);
});
it("test read() given invalid ID", () => {
bookmarkDao.bookmarks = bookmarks;
expect(bookmarkDao.read("invalid_id")).toBeUndefined();
});
it("test update() given valid ID", () => {
bookmarkDao.bookmarks = bookmarks;
const bookmark = bookmarks[0];
expect(
bookmarkDao.update({
id: bookmark.id,
title: "updated title",
url: "update url",
})
).toMatchObject({
id: bookmark.id,
title: "updated title",
url: "update url",
});
});
it("test update() given invalid ID", () => {
bookmarkDao.bookmarks = bookmarks;
expect(bookmarkDao.update({ id: "invalid_id" })).toBeUndefined();
});
it("test delete() given valid ID", () => {
bookmarkDao.bookmarks = bookmarks;
const toDelete = bookmarks[0];
const bookmark = bookmarkDao.delete(toDelete.id);
expect(toDelete).toMatchObject(bookmark);
expect(bookmarkDao.bookmarks.length).toBe(numBookmarks - 1);
});
it("test delete() given invalid ID", () => {
bookmarkDao.bookmarks = bookmarks;
const bookmark = bookmarkDao.delete("invalid_id");
expect(bookmark).toBeUndefined();
expect(bookmarkDao.bookmarks.length).toBe(numBookmarks);
});
});
Run the tests and notice one is failing!
We will debug the app in the next step. For now, save and commit the changes.